#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
typedef long long LL;
using namespace std;
const int MAXN=207;
const LL INF=0x3f3f3f3f3f3f3f3f;
vector<LL> M[MAXN];
struct node{
	LL x,y;
};
node list[MAXN];
LL n,m,k;
LL r;
queue<LL> length[MAXN];
queue<LL> cnt[MAXN];
LL min_cnt[MAXN];
LL BFS() {
	queue<LL> q;
	q.push(1);
	cnt[1].push(0); length[1].push(0);
	LL pre,len,nex,pre_cnt,pre_length;
	bool flag;
	while (!q.empty()) {
		pre=q.front(); q.pop();
		if (pre==2) break;
		len=M[pre].size();
		pre_cnt=cnt[pre].front(); cnt[pre].pop();
		pre_length=length[pre].front(); length[pre].pop();
//		cout<<"pre"<<pre<<endl;
		for (LL i=0; i<len; ++i) {
			nex=M[pre][i];
//			if (cnt[pre]+(nex>n)>k) cout<<"haha"<<endl;
//			printf("%d %d\n", cnt[pre], (nex>n));
			if (pre_cnt+(nex>n)>k) continue;
//			printf("%d %d %d\n", cnt[pre], (nex>n), cnt[nex]);
			if (pre_cnt+(nex>n)<min_cnt[nex]) {
//				cout<<"nex: "<<nex<<endl;
				q.push(nex);
				length[nex].push(pre_length+1);
				cnt[nex].push(pre_cnt+(nex>n));
				min_cnt[nex]=pre_cnt+(nex>n);
			}
			if (nex==2) return pre_length+1;
		}
//		if (flag) break;
	}
}
int main() {
	cin>>n>>m>>k>>r;
	LL x,y;
	for (LL i=1; i<=n+m; ++i) {
		cin>>x>>y;
		for (LL j=1; j<i; ++j) {
			LL l_x=x-list[j].x, l_y=y-list[j].y;
			if (l_x*l_x + l_y*l_y <= r*r) {
				M[j].push_back(i);
				M[i].push_back(j);
//				cout<<"j: "<<j<<" i: "<<i<<endl;
			}
		}
		list[i].x=x; list[i].y=y;
	}
	memset(min_cnt, 0x3f, sizeof(min_cnt));
	LL res=BFS();
//	for (LL i=0; i<=n+m; ++i) printf("%d%c", length[i], (i==n+m?'\n':' '));
	cout<<res-1<<endl;
	return 0;
}
/*
5 0 0 1
0 0
0 4
0 2
0 1
0 3

5 3 1 3
0 0
5 5
0 3
0 5
3 5
5 2
4 4
3 0

5 3 1 3
0 0
5 5
0 3
0 5
3 4
2 2
4 4
3 0
*/
